/*
 * @Author: your name
 * @Date: 2021-12-27 13:51:32
 * @LastEditTime: 2021-12-27 14:02:35
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: /flutter-learning/Dart_Basic_Grammer/interface.dart
 */

/**
 * 和 Java 一样，dart 也有借口，但是和 Java 是有区别的
 *    首先，dart 的借口没有 interface 关键字定义接口，而是普通类或抽象类都能作为接口被实现
 *    同样使用 implements 关键字进行实现
 * 
 *    但是 dart 的借口有点奇怪，如果实现的类是普通类，会将普通类和抽象中的属性的方法全部复写一遍
 * 
 *    而因为抽象类可以定义抽象方法，普通类不可以，所以一般如果要实现像 Java 接口那样的方式，一般会使用抽象类
 * 
 *    建议使用抽象类定义接口
 */

// 定义一个 DB 库，支持 mysql, mssql, mangodb
// mysql mssql mongodb 三个类里边都有同样的方法

abstract class DB {
  // 当作 Interface
  // 接口就是一个约定，一个规范 
  String uri = ""; // 实现 DB 的地址
  add();
  save();
  delete();
}

class Mysql implements DB {
  @override
  add() {
    // TODO: implement add
    // throw UnimplementedError();
    print("Mysql");
  }

  @override
  delete() {
    // TODO: implement delete
    throw UnimplementedError();
  }

  @override
  save() {
    // TODO: implement save
    throw UnimplementedError();
  }

  @override
  String uri = "";

  Mysql(this.uri);
  
}

class MsSql implements DB {
  @override
  add() {
    // TODO: implement add
    throw UnimplementedError();
  }

  @override
  delete() {
    // TODO: implement delete
    throw UnimplementedError();
  }

  @override
  save() {
    // TODO: implement save
    throw UnimplementedError();
  }

  @override
  String uri = "";

  MsSql(this.uri);
  
}

void main(List<String> args) {
  Mysql mysql = new Mysql("xxx");
  mysql.add();
  
}